const path = require('path');
const fs = require('fs');
const stat =fs.stat;

export default class FileUtils{



//拷贝文件
     static copyFs( src, dst){
        let readable ,writable;
        // 创建读取流
        readable = fs.createReadStream( src );
        // 创建写入流
        writable = fs.createWriteStream( dst );
        // 通过管道来传输流
        readable.pipe( writable );
    }

    /*
    05
     * 复制目录中的所有文件包括子目录
    06
     * @param{ String } 需要复制的目录
    07
     * @param{ String } 复制到指定的目录
    08
     */
    static copy ( src, dst ){
        let _thisxx=this;
        // 读取目录中的所有文件/目录
        fs.readdir( src, function( err, paths ){
            if( err ){
                throw err;
            }

            paths.forEach(function( path ){
                let _src = src + '/' + path,
                    _dst = dst + '/' + path,
                    readable, writable;

                stat( _src, function( err, st ){
                    if( err ){
                        throw err;
                    }

                    // 判断是否为文件
                    if( st.isFile() ){
                        // 创建读取流
                        readable = fs.createReadStream( _src );
                        // 创建写入流
                        writable = fs.createWriteStream( _dst );
                        // 通过管道来传输流
                        readable.pipe( writable );
                    }
                    // 如果是目录则递归调用自身
                    else if( st.isDirectory() ){
                        FileUtils.exists( _src, _dst, FileUtils.copy );
                    }
                });
            });
        });
    };
// 在复制目录前需要判断该目录是否存在，不存在需要先创建目录
    static exists( src, dst, callback ){
        fs.exists( dst, function( exists ){
            // 已存在
            if( exists ){
                callback( src, dst );
            }
            // 不存在
            else{
                fs.mkdir( dst, function(){
                    callback( src, dst );
                });
            }
        });
    };

    //使用时第二个参数可以忽略
    static mkdir(dirpath,dirname){
        let _this=this;
        //判断是否是第一次调用
        if(typeof dirname === "undefined"){
            if(fs.existsSync(dirpath)){
                return;
            }else{
                _this.mkdir(dirpath,path.dirname(dirpath));
            }
        }else{
            //判断第二个参数是否正常，避免调用时传入错误参数
            if(dirname !== path.dirname(dirpath)){
                _this.mkdir(dirpath);
                return;
            }
            if(fs.existsSync(dirname)){
                fs.mkdirSync(dirpath)
            }else{
                _this.mkdir(dirname,path.dirname(dirname));
                fs.mkdirSync(dirpath);
            }
        }
    }

}